扩展IGServer Rest服务 Sample详情

最后更新时间:2019年6月19日

功能介绍

MapGIS Mobile 10.3 for Android SDK全面对接GIS服务器-MapGIS IGServer,支持直接调用在线IGServer的功能服务,同时也支持调用其他第三方Rest服务,扩展弹性很大,在二次开发时能较好满足各种场景功能需求。

基本原理

MapGIS IGServer服务器为用户提供了很多功能服务,例如网络分析、叠加分析、投影变换、影像分析等一系列的功能,用户可以根据其服务需要的数据、参数等信息构造Rest服务请求,发送请求后等待处理结果,然后将结果进行解析、展示。

IGServer功能服务.png

实现流程

接下来介绍如何在移动端对接扩展IGServer服务器提供的功能服务。在此以调用IGServer路径分析工作流服务为例,选择武汉道路网中任意位置点(至少2个),计算位置点间的最短路径,并在客户端显示。

1

服务分析

查看路径分析服务的参数要求,如下图所示,包括网络数据、路径点等参数,在进行服务调用时,需准备好必要的信息。

路径分析服务.png

2

道路网显示

首先实现地图显示,便于分析结果的展示。

mMapView = (MapView) findViewById(R.id.mapView);
mMapView.loadFromFile(Environment.getExternalStorageDirectory().getPath() + "/MapGIS Mobile 2D Sample/Map/MapShow/WuHanRoadNetwork/whdlw.mapx");   //加载武汉道路网地图

2

初始化起始点和终止点

根据道路网数据,寻找确定道路网上的坐标点,作为路径分析的路径点。在移动端可将坐标点绘制显示出来。

Dot dot1 = new Dot(114.46421, 38.024017);  //起点
GraphicPoint graphicPoint1 = new GraphicPoint(dot1, 10);
graphicPoint1.setColor(Color.RED);
Dot dot2 = new Dot(114.53485, 38.069916);  //终点
GraphicPoint graphicPoint2 = new GraphicPoint(dot2, 10);
graphicPoint2.setColor(Color.RED);
mMapView.getGraphicsOverlay().addGraphic(graphicPoint1);//添加绘制起点
mMapView.getGraphicsOverlay().addGraphic(graphicPoint2); //添加绘制终点
mMapView.refresh();  //刷新地图

2

调用IGServer Rest服务

首先,根据网络类数据URL、路径点等信息构建路径分析工作流服务需要的参数。然后构造Rest服务请求,利用HttpURLConnection发送请求,然后获取分析结果。注意网络请求需在子线程中执行。执行路径分析功能服务请求核心代码如下:

public void requestRest () {
    //路径分析参数(工作流参数)
    String paraValues = "netClsUrl:gdbp://MapGisLocal/sample/ds/网络分析/ncls/道路交通网;"
            + "flagPosStr:114.46421,38.024017,114.53485,38.069916;" //路径点坐标序列
            + "elementType:2;" //网络类型:1/2:节点网标/线网标
            + "barrierPosStr:null;" //障碍点坐标序列
            + "nearDis:0.1;" //网标搜索半径
            + "analyTp:UserMode;" //分析类型:用户自定义
            + "weight:,Weight1,Weight1;" //设置网络类的某些属性字段作为权值字段
            + "pathStr:null;" //
            + "outFormat:json"; //返回结果类型:json格式
    try {
        //REST请求路径分析工作流
        String strUrl = "http://develop.smaryun.com:6163/igs/rest/mrfws/execute/600233?paraValues="
                + paraValues
                + "&f=json&isAsy=false&r="
                + Math.random();
        URL url = new URL(strUrl);
        //创建HttpURLConnection对象
        HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
        //设置请求方式
        httpURLConnection.setRequestMethod("GET");
        //设置超时时间
        httpURLConnection.setConnectTimeout(5000);
        //连接
        httpURLConnection.connect();
        //得到响应状态码的返回值
        int code = httpURLConnection.getResponseCode();
        String result = "";
        //正常响应
        if (code == 200) {
            //输入流
            InputStream inputStream = httpURLConnection.getInputStream();
            //输入流读出器
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            //字符输入缓冲类
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String line;
            //从循环流中读取信息
            while ((line = bufferedReader.readLine()) != null) {
                result += line;
            }
            //关闭流
            bufferedReader.close();
        }
        //断开连接
        httpURLConnection.disconnect();
        //解析json
        parseJson(result);
        Log.d("requestIGServerService", "result:" + result);
    } catch (Exception e) {
        Log.d("requestIGServerService", e.getMessage().toString());
        e.printStackTrace();
        //路径分析失败
    }
}

2

获取、解析结果

获取路径分析结果并解析,核心代码如下:

/**
* Json数据解析 
* @param strResult
*/
private void parseJson (String strResult){
    try {
        JSONObject jsonObj1 = new JSONObject(strResult);
        JSONArray results = jsonObj1.getJSONArray("results");
        JSONObject resultObj = results.getJSONObject(0);
        String resultStr = resultObj.getString("Value"
                JSONObject valueObj = new JSONObject(resultStr);//var resultObj = $.parseJSON(result);
        JSONArray pathsArr = valueObj.getJSONArray("Paths");//paths数组
        JSONObject pathObj = pathsArr.getJSONObject(0);
        JSONArray edgesArr = pathObj.getJSONArray("Edges");
        Dot[] coorsDots = new Dot[edgesArr.length() * 2];
        int n = 0;
        for (int i = 0; i < edgesArr.length(); i++) {
            JSONObject edgeObj = edgesArr.getJSONObject(i);//edges[i]
            JSONArray dotArr = edgeObj.getJSONArray("Dots");
            for (int j = 0; j < 2; j++) {
                JSONObject dotObj = dotArr.getJSONObject(j);//Dots[i]
                Dot dot = new Dot();
                dot.x = dotObj.getDouble("x");
                dot.y = dotObj.getDouble("y");
                coorsDots[n] = dot;
                n++;
            }//for j
        }//for i
        drawGraphicPolylin(coorsDots); //绘制路线
    } catch (JSONException e) {
        System.out.println("Json parse error");
        e.printStackTrace();
    }
}

/**
 * 绘制路线
 * @param coorsDots
 */
public void drawGraphicPolylin (Dot[]coorsDots){
    //设置绘制的路径
    GraphicPolylin graphicPolylin = new GraphicPolylin();
    for (int k = 0; k < coorsDots.length; k++) {
        graphicPolylin.appendPoint(coorsDots[k]);
        graphicPolylin.setColor(Color.argb(255, 0, 0, 255));
    }
    mMapView.getGraphicsOverlay().addGraphic(graphicPolylin); //绘制该路径
    mMapView.refresh();
}

实现结果如下图所示:

调用IGServer路径分析功能服务.jpg